import { useRef } from 'react'

// 检测依赖项数组有无变化
function depsAreSame(oldDeps: any[], deps: any[]): boolean {
  // 依赖项数组的地址对比
  if (oldDeps === deps) return true
  // 数组的第一层对比
  for (let i in oldDeps) {
    if (oldDeps[i] !== deps[i]) return false
  }
  return true
}
// `useRef` 返回一个可变的 ref 对象，其 `.current` 属性被初始化为传入的参数（`initialValue`）。返回的 ref 对象在组件的整个生命周期内保持不变。而且 useRef 实现了类似 class 中的 `this` 的功能。
// 使用场景：useRef( ).current 可以跨越渲染周期存储数据（在current 上增加属性存储对象，current 可以保存任何可变值，当其被赋值给 DOM 元素或组件的 ref 属性，current 会指向 DOM 元素或组件实例），而且对 current 修改也不会引起组件渲染。
export default function useCreation<T>(factory: () => T, deps: any[]) {
  const { current } = useRef({
    deps,
    obj: <undefined | T>undefined,
    initialized: false,
  })
  if (current.initialized === false || !depsAreSame(current.deps, deps)) {
    current.deps = deps
    current.obj = factory()
    current.initialized = true
  }
  return current.obj as T
}
